home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3d2.s < prev    next >
Text File  |  1994-10-30  |  9KB  |  233 lines

  1.  
  2. ; Lezione3d2.s    BARRETTA CHE SALE E SCENDE FATTA COL MOVE&WAIT DEL COPPER
  3.  
  4.  
  5. ;    Routine eseguita 1 volta ogni 3 fotogrammi
  6.  
  7.  
  8.     SECTION    CiriCop,CODE    ; anche in Fast va bene
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase in a6
  12.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  13.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  14.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  15.                 ; le librerie, e da in uscita l'indirizzo
  16.                 ; di base di quella libreria da cui fare le
  17.                 ; distanze di indirizzamento (Offset)
  18.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  19.     move.l    d0,a6
  20.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  21.                 ; di sistema
  22.     move.l    #COPPERLIST,$dff080    ; COP1LC - Puntiamo la nostra COP
  23.     move.w    d0,$dff088        ; COPJMP1 - Facciamo partire la COP
  24. mouse:
  25.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  26.     bne.s    mouse        ; Se non ancora, non andare avanti
  27. frame:
  28.     cmpi.b    #$fe,$dff006    ; Siamo alla linea 254? (deve rifare il giro!)
  29.     bne.s    frame        ; Se non ancora, non andare avanti
  30. frame2:
  31.     cmpi.b    #$fd,$dff006    ; Siamo alla linea 253? (deve rifare il giro!)
  32.     bne.s    frame2        ; Se non ancora, non andare avanti
  33.  
  34.     bsr.s    MuoviCopper    ; Una routine che fa scendere e salire la barra
  35.  
  36.  
  37.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  38.     bne.s    mouse        ; se no, torna a mouse:
  39.  
  40.     move.l    OldCop(PC),$dff080    ; COP1LC - Puntiamo la cop di sistema
  41.     move.w    d0,$dff088        ; COPJMP1 - facciamo partire la cop
  42.  
  43.     move.l    4.w,a6
  44.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  45.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  46.                 ; (vanno aperte e chiuse le librerie!!!)
  47.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  48.     rts
  49.  
  50. ;    Routine muovicopper modificata in stile con lo "ZOOM" gia' visto
  51.  
  52. MuoviCopper:
  53.     LEA    BARRA,a0
  54.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  55.                 ; azzerata, (cioe' il TST verifica il BEQ)
  56.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  57.                 ; (se cioe' questo TST non e' verificato)
  58.                 ; continuiamo salendo (facendo dei subq)
  59.     beq.w    VAIGIU
  60.     cmpi.b    #$82,8*9(a0)    ; siamo arrivati alla linea $82?
  61.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  62. ;    subq.b    #1,(a0)
  63.     subq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  64.     subq.b    #2,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes
  65.     subq.b    #3,8*3(a0)
  66.     subq.b    #4,8*4(a0)
  67.     subq.b    #5,8*5(a0)
  68.     subq.b    #6,8*6(a0)
  69.     subq.b    #7,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  70.     subq.b    #8,8*8(a0)    ; barra rossa ogni volta per farla salire!
  71.     subq.b    #8,8*9(a0)
  72.     rts
  73.  
  74. MettiGiu:
  75.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  76.     rts            ; fara' saltare alla routine VAIGIU, e
  77.                 ; la barra scedera'
  78.  
  79. VAIGIU:
  80.     cmpi.b    #$fa,8*9(a0)    ; siamo arrivati alla linea $fc?
  81.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  82. ;    addq.b    #1,(a0)
  83.     addq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  84.     addq.b    #2,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes
  85.     addq.b    #3,8*3(a0)
  86.     addq.b    #4,8*4(a0)
  87.     addq.b    #5,8*5(a0)
  88.     addq.b    #6,8*6(a0)
  89.     addq.b    #7,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  90.     addq.b    #8,8*8(a0)    ; barra rossa ogni volta per farla scendere!
  91.     addq.b    #8,8*9(a0)
  92.     rts
  93.  
  94. MettiSu:
  95.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  96.     rts            ; significa che dobbiamo risalire.
  97.  
  98. SuGiu:
  99.     dc.b    0,0
  100.  
  101. GfxName:
  102.     dc.b    "graphics.library",0,0    
  103.  
  104. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  105.     dc.l    0    ; della graphics.library
  106.  
  107. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  108.     dc.l    0
  109.  
  110.     SECTION    GRAPHIC,DATA_C    ; Questo comando fa caricare dal sistema
  111.                 ; operativo questo segmento di dati
  112.                 ; in CHIP RAM, obbligatoriamente
  113.                 ; Le copperlist DEVONO essere in CHIP RAM!
  114.  
  115. COPPERLIST:
  116.     dc.w    $100,$200    ; BPLCON0
  117.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  118.     dc.w    $4907,$FFFE    ; WAIT - Aspetto la linea $49 (73)
  119.     dc.w    $180,$001    ; COLOR0 - blu scurissimo
  120.     dc.w    $4a07,$FFFE    ; WAIT - linea 74 ($4a)
  121.     dc.w    $180,$002    ; blu un po' piu' intenso
  122.     dc.w    $4b07,$FFFE    ; linea 75 ($4b)
  123.     dc.w    $180,$003    ; blu piu' chiaro
  124.     dc.w    $4c07,$FFFE    ; prossima linea
  125.     dc.w    $180,$004    ; blu piu' chiaro
  126.     dc.w    $4d07,$FFFE    ; prossima linea
  127.     dc.w    $180,$005    ; blu piu' chiaro
  128.     dc.w    $4e07,$FFFE    ; prossima linea
  129.     dc.w    $180,$006    ; blu a 6
  130.     dc.w    $5007,$FFFE    ; salto 2 linee: da $4e a $50, ossia da 78 a 80
  131.     dc.w    $180,$007    ; blu a 7
  132.     dc.w    $5207,$FFFE    ; sato 2 linee
  133.     dc.w    $180,$008    ; blu a 8
  134.     dc.w    $5507,$FFFE    ; salto 3 linee
  135.     dc.w    $180,$009    ; blu a 9
  136.     dc.w    $5807,$FFFE    ; salto 3 linee
  137.     dc.w    $180,$00a    ; blu a 10
  138.     dc.w    $5b07,$FFFE    ; salto 3 linee
  139.     dc.w    $180,$00b    ; blu a 11
  140.     dc.w    $5e07,$FFFE    ; salto 3 linee
  141.     dc.w    $180,$00c    ; blu a 12
  142.     dc.w    $6207,$FFFE    ; salto 4 linee
  143.     dc.w    $180,$00d    ; blu a 13
  144.     dc.w    $6707,$FFFE    ; salto 5 linee
  145.     dc.w    $180,$00e    ; blu a 14
  146.     dc.w    $6d07,$FFFE    ; salto 6 linee
  147.     dc.w    $180,$00f    ; blu a 15
  148.     dc.w    $780f,$FFFE    ; linea $78
  149.     dc.w    $180,$000    ; colore NERO
  150.  
  151. BARRA:
  152.     dc.w    $7907,$FFFE    ; aspetto la linea $79
  153.     dc.w    $180,$300    ; inizio la barra rossa: rosso a 3
  154.     dc.w    $7a07,$FFFE    ; linea seguente
  155.     dc.w    $180,$600    ; rosso a 6
  156.     dc.w    $7b07,$FFFE
  157.     dc.w    $180,$900    ; rosso a 9
  158.     dc.w    $7c07,$FFFE
  159.     dc.w    $180,$c00    ; rosso a 12
  160.     dc.w    $7d07,$FFFE
  161.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  162.     dc.w    $7e07,$FFFE
  163.     dc.w    $180,$c00    ; rosso a 12
  164.     dc.w    $7f07,$FFFE
  165.     dc.w    $180,$900    ; rosso a 9
  166.     dc.w    $8007,$FFFE
  167.     dc.w    $180,$600    ; rosso a 6
  168.     dc.w    $8107,$FFFE
  169.     dc.w    $180,$300    ; rosso a 3
  170.     dc.w    $8207,$FFFE
  171.     dc.w    $180,$000    ; colore NERO
  172.  
  173.     dc.w    $fd07,$FFFE    ; aspetto la linea $FD
  174.     dc.w    $180,$00a    ; blu intensita' 10
  175.     dc.w    $fe07,$FFFE    ; linea seguente
  176.     dc.w    $180,$00f    ; blu intensita' massima (15)
  177.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  178.  
  179.  
  180.     end
  181.  
  182. In questo esempio la routine Muovicopper viene eseguita 1 volta ogni 3 FRAME,
  183. ossia 1 volta ogni 3 cinquantesimi di secondo, per rallentare l'eccessiva
  184. velocita', tramite lo stratagemma dei vari cmp con il $dff006.
  185. D'altronde il fatto che e' eseguita ogni 3 fotogrammi la rende anche meno
  186. fluida, come si nota dagli scatti che fa nella parte inferiore.
  187.  
  188. Questo e' il momento per insegnarvi qualche trucchetto del mestiere.
  189. Se si devono fare delle modifiche a lunghe COPPERLIST, per esempio
  190. si devono cambiare tutti gli 07 in 87, per far aspettare la meta' di ogni
  191. linea anziche' l'inizio, si puo' usare il comando REPLACE dell'editor,
  192. che permette di cambiare una data stringa di caratteri con un'altra.
  193. Per fare la modifica che ho detto, dovete posizionarvi col cursore all'inizio
  194. della COPPERLIST, dopodiche' premere insieme i tasti "AMIGA+SHIFT+R", e
  195. comparira' in altro la scritta "Search For:". Qua dovete scrivere il testo
  196. originale da cercare, in questo caso scrivete "07,$fffe" e premete return.
  197. Ora apparira' la scritta "Replace with:". Qua dovete mettere la modifica che
  198. intendere fare: ossia "87,$fffe". A questo punto il cursore andra' sul
  199. primo 07,$fffe e apparira' la scritta "Replace: (Y/N/L/G)". A questo punto
  200. si deve decidere se scambiare o no lo 07 con l'87. Se lo volete cambiare,
  201. premete la Y, se non lo volete cambiare, premete N. Fatta la scelta il
  202. cursore andra' sul prossimo 07,$fffe e ripetera' la domanda. Cambiateli
  203. pure tutti fino alla fine della copperlist, dopodiche' fermatevi con ESC per
  204. non cambiare quelli nel commento sottostante. Se premete il G alla scelta
  205. saranno scambiati tutti gli 07,$fffe, fino alla fine del testo. Pensateci
  206. bene prima di usare il G (GLOBALE), potreste cambiare qualcosa che non andava
  207. cambiato. E' meglio procedere facendo Y o N fino alla fine della zona da
  208. cambiare, dopodiche' premete ESC per terminare, oppure premete la L all'ultima
  209. modifica da fare (indica LOCALE, ossia ULTIMO CAMBIAMENTO DA FARE).
  210.  
  211. Una volta fatta questa modifica, eseguite il listato: noterete che la barretta
  212. e le altre "sfumature" hanno una scalettatura verso il centro. Questo e'
  213. proprio perche' cambiamo colore nel mezzo ($87) anziche' all'inizio del video.
  214.  
  215. Provate ora a ricambiare tutto: fate il REPLACE, dando come stringa originale
  216. "87,$ff" e come stringa nuova "$67,$ff". Noterete che la scalettatura e' piu'
  217. a destra. Per finire, fate un altro effetto: ora avete tutti i wait cambiati
  218. in $xx67,$fffe, ebbene, provate a cambiarli in $xx69,$fffe, ma uno si e uno
  219. no, ossia, immettete alla domanda del replace come prima stringa "67,$ff" e
  220. come seconda "69,$ff", dopodiche' premete una volta Y, quella dopo N, quella
  221. dopo Y e cosi' via, uno Y e uno N.
  222. In questo modo una volta il colore cambiera' alla linea $67 e l'altra a $69,
  223. creando un effetto simile all'incastro dei mattoncini, provate ad eseguirlo.
  224.  
  225. L'incastro sara' simile a questo:
  226.  
  227.     ooooooo+++++
  228.     oooo++++++++
  229.     oooooo++++++
  230.     oooo++++++++
  231.     oooooo++++++
  232.  
  233.